﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using RestaurantManagement.Controls;
using WindowsFormsPresenter.InventoryItemCategory;
using WindowsFormsModel.BusinessObjects;
using DevExpress.XtraEditors;
using WindowsFormsView;

namespace RestaurantManagement.Modules.Production
{
    public partial class uMaterialCategory : BaseModule, IInventoryItemCategoryView, IInventoryItemCategoriesView
    {
        #region Presenter

        private InventoryItemCategoryPresenter _inventoryItemCategoryPresenter;
        private InventoryItemCategoriesPresenter _inventoryItemCategoriesPresenter;

        #endregion

        #region Field

        public IList<InventoryItemCategoryModel> InventoryItemCategories
        {
            set
            {
                var inventoryItemCategories = value;
                AddInventoryItemCategoryToCombobox(inventoryItemCategories);
                AddUserGroupToGrid(inventoryItemCategories);
            }
        }

        public string InventoryCategoryID { get; set; }

        public string InventoryCategoryCode
        {
            get { return txtInventoryCategoryCode.Text; }
            set { txtInventoryCategoryCode.Text = value; }
        }

        public string InventoryCategoryName
        {
            get { return txtInventoryCategoryName.Text; }
            set { txtInventoryCategoryName.Text = value; }
        }

        public string ParentID
        {
            get
            {
                if ((chkIsParent.Checked == false) && (cboParentID.EditValue != null))
                {
                    return cboParentID.EditValue.ToString();
                }
                else { return null; }
            }
            set { cboParentID.EditValue = value; }
        }

        public bool IsParent
        {
            get { return chkIsParent.Checked; }
            set { chkIsParent.Checked = value; }
        }

        public bool IsMaterial
        {
            get { return true; }
            set
            {
                chkIsActive.Checked = value;
                if (chkIsParent.Checked == true) { cboParentID.Enabled = false; cboParentID.EditValue = null; }
                else { cboParentID.Enabled = true; }
            }
        }

        public string RestaurantID { get; set; }

        public string Description
        {
            get { return txtDescription.Text; }
            set { txtDescription.Text = value; }
        }

        public bool IsActive
        {
            get { return chkIsActive.Checked; }
            set
            {
                chkIsActive.Checked = value;
                if (chkIsParent.Checked == true) { cboParentID.Enabled = false; cboParentID.EditValue = null; }
                else { cboParentID.Enabled = true; }
            }
        }

        #endregion

        #region Style Button

        private void btnAddNew_MouseHover(object sender, EventArgs e)
        {
            btnAddNew.BackgroundImage = null;
            btnAddNew.BackgroundImageLayout = ImageLayout.Center;
            btnAddNew.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.them_icon_2);
        }

        private void btnAddNew_MouseLeave(object sender, EventArgs e)
        {
            btnAddNew.BackgroundImage = null;
            btnAddNew.BackgroundImageLayout = ImageLayout.Center;
            btnAddNew.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.them_con);
        }

        private void btnUpdate_MouseHover(object sender, EventArgs e)
        {
            btnUpdate.BackgroundImage = null;
            btnUpdate.BackgroundImageLayout = ImageLayout.Center;
            btnUpdate.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.sua_icon_2);
        }

        private void btnUpdate_MouseLeave(object sender, EventArgs e)
        {
            btnUpdate.BackgroundImage = null;
            btnUpdate.BackgroundImageLayout = ImageLayout.Center;
            btnUpdate.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.sua_icon);
        }

        private void btnDelete_MouseHover(object sender, EventArgs e)
        {
            btnDelete.BackgroundImage = null;
            btnDelete.BackgroundImageLayout = ImageLayout.Center;
            btnDelete.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.xoa_icon_2);
        }

        private void btnDelete_MouseLeave(object sender, EventArgs e)
        {
            btnDelete.BackgroundImage = null;
            btnDelete.BackgroundImageLayout = ImageLayout.Center;
            btnDelete.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.xoa_icon);
        }

        private void btnRefresh_MouseLeave(object sender, EventArgs e)
        {
            btnRefresh.BackgroundImage = null;
            btnRefresh.BackgroundImageLayout = ImageLayout.Center;
            btnRefresh.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.lammoi_icon);
        }

        private void btnRefresh_MouseHover(object sender, EventArgs e)
        {
            btnRefresh.BackgroundImage = null;
            btnRefresh.BackgroundImageLayout = ImageLayout.Center;
            btnRefresh.BackgroundImage = new Bitmap(RestaurantManagement.Properties.Resources.lammoi_icon_2);
        }

        #endregion

        private void AddUserGroupToGrid(IList<InventoryItemCategoryModel> inventoryItemCategories)
        {
            if (inventoryItemCategories != null)
            {
                treeMain.DataSource = inventoryItemCategories;
                treeMain.ForceInitialize();

                treeMain.ParentFieldName = "ParentID";
                treeMain.KeyFieldName = "InventoryCategoryID";

                treeMain.CollapseAll();
                treeMain.BestFitColumns();

                for (int i = 0; i < treeMain.Columns.Count; i++) { treeMain.Columns[i].Visible = false; }

                treeMain.Columns["InventoryCategoryCode"].Visible = true;
                treeMain.Columns["InventoryCategoryName"].Visible = true;
                treeMain.Columns["Description"].Visible = true;

                treeMain.Columns["InventoryCategoryCode"].Caption = "Mã loại nguyên liệu";
                treeMain.Columns["InventoryCategoryName"].Caption = "Tên loại nguyên liệu";
                treeMain.Columns["Description"].Caption = "Mô tả";

                treeMain.Columns["InventoryCategoryCode"].VisibleIndex = 0;
                treeMain.Columns["InventoryCategoryName"].VisibleIndex = 1;
                treeMain.Columns["Description"].VisibleIndex = 2;
            }
            else { treeMain.DataSource = null; }

            treeMain.Focus();
        }

        private void AddInventoryItemCategoryToCombobox(IList<InventoryItemCategoryModel> inventoryItemCategories)
        {
            if (inventoryItemCategories != null)
            {
                cboParentID.Properties.DataSource = inventoryItemCategories;
                cboParentID.Properties.DisplayMember = "InventoryCategoryName";
                cboParentID.Properties.ValueMember = "InventoryCategoryID";

                cboParentID.Properties.PopulateColumns();
                for (int i = 0; i < cboParentID.Properties.Columns.Count; i++) { cboParentID.Properties.Columns[i].Visible = false; }

                cboParentID.Properties.Columns["InventoryCategoryCode"].Visible = true;
                cboParentID.Properties.Columns["InventoryCategoryName"].Visible = true;

                cboParentID.Properties.Columns["InventoryCategoryCode"].Caption = "Mã loại nguyên liệu";
                cboParentID.Properties.Columns["InventoryCategoryName"].Caption = "Tên loại nguyên liệu";

                cboParentID.ItemIndex = 1;
            }
            else { cboParentID.Properties.DataSource = null; }
        }

        public uMaterialCategory()
        {
            InitializeComponent();

            _inventoryItemCategoryPresenter = new InventoryItemCategoryPresenter(this);
            _inventoryItemCategoriesPresenter = new InventoryItemCategoriesPresenter(this);
        }

        private void uMaterialCategory_Load(object sender, EventArgs e)
        {
            try
            {
                _inventoryItemCategoriesPresenter.Display(IsMaterial);
            }
            catch (ApplicationException ex) { XtraMessageBox.Show(ex.Message, "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void btnAddNew_Click(object sender, EventArgs e)
        {
            if ((string.IsNullOrEmpty(InventoryCategoryCode)) || (string.IsNullOrEmpty(InventoryCategoryName)))
            {
                XtraMessageBox.Show("Bạn chưa nhập đủ thông tin !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if ((chkIsParent.Checked == false) && (cboParentID.EditValue == null))
            {
                XtraMessageBox.Show("Bạn chưa nhập loại nguyên liệu cha !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cboParentID.Focus();
                return;
            }
            //check ma so nhap vao
            var node = treeMain.FindNodeByFieldValue("InventoryCategoryCode", txtInventoryCategoryCode.Text);
            if (node != null)
            {
                XtraMessageBox.Show("Mã số loại nguyên liệu đã tồn tại trong CSDL !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtInventoryCategoryCode.Text = null;
                txtInventoryCategoryCode.Focus();
                return;
            }
            try
            {
                InventoryCategoryID = null;
                _inventoryItemCategoryPresenter.Save();
                _inventoryItemCategoriesPresenter.Display(IsMaterial);
                XtraMessageBox.Show("Thêm mới dữ liệu hoàn thành !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (ApplicationException ex) { XtraMessageBox.Show(ex.Message, "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            if ((string.IsNullOrEmpty(InventoryCategoryCode)) || (string.IsNullOrEmpty(InventoryCategoryName)))
            {
                XtraMessageBox.Show("Bạn chưa nhập đủ thông tin !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if ((chkIsParent.Checked == false) && (cboParentID.EditValue == null))
            {
                XtraMessageBox.Show("Bạn chưa nhập nguyên liệu cha !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cboParentID.Focus();
                return;
            }
            if (cboParentID.EditValue != null)
            {
                if (InventoryCategoryID == cboParentID.EditValue.ToString())
                {
                    XtraMessageBox.Show("Bạn không được chọn mã loại cha là chính nó !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    cboParentID.Focus();
                    return;
                }
            }
            if (txtInventoryCategoryCode.Text != InventoryCategoryCode)
            {
                var node = treeMain.FindNodeByFieldValue("InventoryCategoryCode", txtInventoryCategoryCode.Text);
                if (node != null)
                {
                    XtraMessageBox.Show("Mã số loại nguyên liệu đã tồn tại trong CSDL !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtInventoryCategoryCode.Text = null;
                    txtInventoryCategoryCode.Focus();
                    return;
                }
            }

            try
            {
                _inventoryItemCategoryPresenter.Save();
                _inventoryItemCategoriesPresenter.Display(IsMaterial);
                XtraMessageBox.Show("Sửa dữ liệu hoàn thành !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (ApplicationException ex) { XtraMessageBox.Show(ex.Message, "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                if (treeMain.FocusedNode.Focused == true)
                {
                    new InventoryItemCategoryPresenter(null).Delete(treeMain.FocusedNode.GetValue("InventoryCategoryID").ToString());
                    _inventoryItemCategoriesPresenter.Display(IsMaterial);
                    XtraMessageBox.Show("Xóa dữ liệu hoàn thành !", "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    XtraMessageBox.Show("Bạn chưa chọn dòng để xóa !", "Nhà hàng Hương Việt", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            catch (ApplicationException ex) { XtraMessageBox.Show(ex.Message, "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            try { _inventoryItemCategoriesPresenter.Display(IsMaterial); }
            catch (ApplicationException ex) { XtraMessageBox.Show(ex.Message, "Nhà hàng Hương Việt !", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void treeMain_AfterFocusNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
        {
            if (e.Node.GetValue("InventoryCategoryID") != null)
            {
                _inventoryItemCategoryPresenter.Display(e.Node.GetValue("InventoryCategoryID").ToString());
            }
        }

        private void chkIsParent_CheckedChanged(object sender, EventArgs e)
        {
            if (chkIsParent.Checked == true) { cboParentID.Enabled = false; cboParentID.EditValue = null; }
            else { cboParentID.Enabled = true; }
        }
    }
}
